package com.tedu.review.day02;
/**
 * 普通类  √
 * 抽象类=抽象方法   关键字  abstract
 * 只有行为的概念，没有具体的实现行为
 *
 * 与面向对象的多态有绝对关系
 * 产生子类【实现类】同时具备属性和方法
 *
 * 什么情况下是使用？
 * 复杂项目时，需要在不同类中实现，不同功能，首选抽象类【Android常用】
 *
 * 定义抽象类：
 * 修饰符 abstract class 类名{}   抽象类本身没有任何意义
 * 创建抽象类同时必须存在抽象方法
 * 修饰符 abstract 返回值 方法名();  定义抽象的方法，提供给子类使用
 *
 * 抽象类实例化:
 * 必须使用多态，向上造型，自身无法实例化【实现类】
 *
 * 定义   使用   注意
 *
 * 抽象类使用注意：抽象类和抽象方法必须使用abstract关键字修饰
 *                    可以定义静态属性，静态方法，不可以定义抽象属性
 *                    可以存在构造器，不可以定义静态抽象方法、静态抽象属性
 *                    可以存在内部类：静态内部类，抽象类继承抽象类
 *                    Java只允许单继承，实现只需要继承子抽象类
 */
abstract /*static*/ class Animals{    //1.可以使用static修饰
    //类定义:修饰符[abstract static] class 类名{}
     public abstract void say();      //抽象方法：没有任何实现
    //2.定义修饰final的抽象方法
        //public final abstract void sleep();
    //3.定义抽象属性|定义静态属性
    //abstract int i;
 static int i;//声明未赋值
//4.定义抽象静态属性   √
   //abstract static int j;
    //5.定义静态抽象方法   语法：修饰符[static abstract] 返回值  方法名
//public static abstarct void eat();
//6.定义静态方法  √ 需要加代码块{}一定空    实现类不需要一定实现
public static void eat(){};
//7.可以存在内部类，可以存在静态内部类
    public static class Sas{}
//8.抽象类构造器------存在 √
    public Animals(){
    }
}
//9抽象类可以继承抽象类   √
abstract class Thing extends Animals{
//成员变量
    protected abstract int result();
}
//实现类：子类、继承、抽象类、完成：抽象类方法
//10.实现类【子类】继承俩抽象类   ×   但是，实现最终继承[子]抽象类


//实现类：子类  继承  抽象类  完成：抽象类方法
class People extends Animals{
       public void say(){
           System.out.println("大马猴");
       }
}
//实现类：假设 Animals  有俩抽象方法 请问子类需要实现抽象类全部方法
class Monkey extends Animals{
       public void say(){
           System.out.println("旭旭宝宝");
   }
}
public class 抽象类 {
    public static void main(String[] args) {
         //抽象---实例化【创建对象】--多态：向上造型
        Animals a=new People();
        a.say();  //输出：重写后的值
        //实现抽象类实例化
        Animals a1=new Monkey();
        a1.say();  //输出：重写后的值  【方法互通】

    }
}
